#pragma once
#include <mutex>
#include "util.hpp"

namespace CH{
#define CONFIG_FILE "./cloud.conf"
	class CH{
		private:
			Config(){
				ReadConfigFile();//都取配置文件信息
			}
			//以单例模式构建这个类，由于配置文件的数据是通用的，所以只需要创建一次即可
			//static修饰的成员变量只能在类外定义
			static Config *_instance;
			//单例模式在多线程情况下，是不安全的
			static std::mutex _mutex;
		private:
			int _hot_time;						//热点管理时间
			int _server_port;					//服务器端口号
			std::string _server_ip;				//服务器ip地址
			std::string _download_prefix;		//下载路径前缀
			std::string _packfile_suffix;		//压缩后缀
			std::string _pack_dir;				//压缩文件存放的文件夹
			std::string _back_dir;				//备份文件存放的文件夹
			std::string _backup_file;			//持久存储信息文件
			//将配置文件的信息全部读取到类中
			bool ReadConfigFile() {
				//打开配置文件，将配置文件的读到字符串中
				FileUtil fu(CONFIG_FILE);
				std::string body;
				if(fu.GetContent(&body) == false){
					std::cout << "load config file failed!\n";
					return false;
				}
				//由于配置文件是按序列化后存储的方式，所以我们可以将其反序列化，把数据放入root对象中
				Json::Value root;
				if (JsonUtil::UnSerialize(body, &root) == false){
					std::cout << "parse config file failed!\n";
					return false;
				}
				//从root对象中，取出对应的信息
				_hot_time = root["hot_time"].asInt();
				_server_port = root["server_port"].asInt();
				_server_ip = root["server_ip"].asString();
				_download_prefix = root["download_prefix"].asString();
				_packfile_suffix = root["packfile_suffix"].asString();
				_pack_dir = root["pack_dir"].asString();
				_back_dir = root["back_dir"].asString();
				_backup_file = root["backup_file"].asString();
				return true;
			}
		public:
			//返回Config对象
			static Config *GetInstance() {
				if (_instance == NULL){
					_mutex.lock();
					if (_instance == NULL) {
						_instance = new Config();
					}
					_mutex.unlock();
				}
				return _instance;
			}
			//返回热点管理时间
			int GetHotTime() {
				return _hot_time;
			}
			//返回服务器端口号
			int GetServerPort() {
				return _server_port;
			}
			//返回服务器ip地址
			std::string GetServerIp() {
				return _server_ip;
			}
			//返回下载路径前缀
			std::string GetDownloadPrefix() {
				return _download_prefix;
			}
			//返回压缩后缀
			std::string GetPackFileSuffix() {
				return _packfile_suffix;
			}
			//返回压缩文件存放的文件夹
			std::string GetPackDir() {
				return _pack_dir;
			}
			//返回备份文件存放的文件夹
			std::string GetBackDir() {
				return _back_dir;
			}
			//返回持久存储信息文件
			std::string GetBackupFile() {
				return _backup_file;
			}
	};
	Config *Config::_instance = NULL;
	std::mutex Config::_mutex;
}